﻿// B. Wrath.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://codeforces.com/problemset/problem/892/B

有 n 个有罪的人排成一行，其中第 i 个手持长度为 Li 的爪子。钟声响起，每个人都杀死了他前面的一些人。所有人同时杀死其他人。
也就是说，当且仅当 j < i 且 j ≥ i - Li 时，第 i 个人杀死第 j 个人。

你得到了爪子的长度。您需要找出铃声响起后活着的总人数。

输入
第一行包含一个整数 n（1 ≤ n ≤ 106）--有罪人数。

第二行包含 n 个空格分隔的整数 L1、L2、......、Ln（0 ≤ Li ≤ 109），其中 Li 是第 i 个人爪子的长度。

输出
打印一个整数--铃声响起后活着的总人数。

Examples
InputCopy
4
0 1 0 10
OutputCopy
1
InputCopy
2
0 0
OutputCopy
2
InputCopy
10
1 1 3 0 0 0 2 1 0 3
OutputCopy
3


8
0 0 0 1 0 0 1 2


5
注释
在第一个样本中，最后一个人杀死了他面前的所有人。
*/

//一题多解
//1 差分？ O(n)
//2 线段合并，然后二分查找当前元素是否处于一个线段的结束和一个新线段开始的中间   O(nlogn)
//3 官解	 第i名能否存活 取决于 j(j>i && j <=n)后所有人员的爪子(i-a[i])能否覆盖第i名的坐标i

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

const int N = 1000010;
int a[N];
int n;

int backmax[N];


int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	memset(backmax, 0x3f, sizeof backmax);

	int ans = 0;
	//逆序求 n到当前i的 爪子能覆盖到的最大位置(也是最小坐标值)
	for (int i = n; i >= 1; i--) {
		backmax[i] = backmax[i + 1];
		if (i < backmax[i]) ans++;
		backmax[i] = min(backmax[i], i - a[i]);
		//爪子太长 负数了 haha
		backmax[i] = max(0, backmax[i]);
	}

	cout << ans << endl;

	return 0;
}